# 在道路上寻找车道线

# 导入项目所需包
import numpy as np
import cv2



#-------------------书写一些辅助函数方法--------------

# input: RGB三通道 图片
# output: 单通道灰度图
# 注意: 	如果说你使用 cv2.imread()方法写入图象 呢么读入的图象格式为BGR 
#       这时你需要去调用 grayscale_cv2 方法
def grayscale(img):
	return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

def grayscale_cv2(img):
	return cv2.cvtColor(img, cv2.COLOR_BGB2GRAY) 


# Canny算子变换
def canny(img, low_threshold, high_threshold):
	return cv2.Canny(img, low_threshold, high_threshold)


# 应用高斯平滑 抑制噪声与虚假梯度
def gaussian_blur(img, kernel_size):
	return cv2.GaussianBlur(img, (kernel_size, kernel_size), 0)


# 设置 ROI 兴趣区域
# 仅保留由自定义的区域组成 其余部分为黑色
# vertices 是整数点的 numpy 数组
def region_of_interest(img, vertices):
	# 定义空白遮罩
	mask = np.zeros_like(img)

	# 根据通道数 填充颜色
	if len(img.shape) > 2:
		channel_count =  img.shape[2]
		ignore_mask_color = (255,) * channel_count
	else:
		ignore_mask_color = 255

	# 使用填充颜色 填充顶点为 vertices 定义的多边形内的像素
	cv2.fillPoly(mask, vertices, ignore_mask_color)

	# 仅在遮挡像素不为零的情况下返回图像
	masked_image = cv2.bitwise_and(img, mask)
	return masked_image 


# 使用 color 与 thickness 绘制线条
# 在原图像上绘制线条 (试图向发生变化)
def draw_lines(img, lines, color=[255, 0, 0], thickness=2):
	for line in lines:
		for x1,y1,x2,y2 in line:
			cv2.line(img, (x1, y1), (x2, y2), color, thickness)


# 输入的图象一定要先经过 Canny变换输出
# 返回的图象已经经过了 Hough 变换
def hough_lines(img, rho, theta, threshold, min_line_len, max_line_gap):
    lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]), minLineLength=min_line_len, maxLineGap=max_line_gap)
    line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
    draw_lines(line_img, lines)
    return line_img

# 这里输入的图象一定要是经过 hough_lines() 的输出 是一幅画有线条的图象
# 应该是一个全白(全黑)的图象 上面画有线条
# 计算公式: initial_img * α + img * β + γ
# 注意 img 与 initial_img 必须保证 shape 一致
def weighted_img(img, initial_img, α = 0.8, β = 1., γ = 0.):
    return cv2.addWeighted(initial_img, α, img, β, γ)


#-------------------------------------------------------------------------------
